home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
pctj0187.arc
/
BOTTLE2.ASM
< prev
next >
Wrap
Assembly Source File
|
1987-01-28
|
8KB
|
304 lines
;
; Listing 2.
;
; Modified from listings in "Out From the Shadow of IBM," by
; Steven Armbrust, Ted Forgeron, and Paul Pierce,
; PC Tech Journal, August, 1986.
;
; Assembled with Microsoft Assembler version 4.0.
;
NAME TIME
_TEXT SEGMENT BYTE PUBLIC 'CODE'
_TEXT ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
DGROUP GROUP CONST, _BSS, _DATA
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
TESTSEG SEGMENT WORD PUBLIC 'TEST'
TESTSEG_START DW 32767 DUP (?)
TESTSEG ENDS
PPI_PORT EQU 061H
TIMER2_PORT EQU 042H
TIMER_CTRL EQU 043H
_TEXT SEGMENT
;***************************************************************;
; ;
; _BSTOTIME ;
; TIME EXECUTION OF REP STOSB INSTRUCTION ;
; ;
;***************************************************************;
PUBLIC _BSTOTIME
_BSTOTIME PROC NEAR
PUSH BP ; SAVE FRAME
MOV BP, SP ;
PUSH ES ; SAVE ES
PUSH DI ; SAVE DI
CALL SETUP_TIMER ; SET UP TIMER
MOV CX, [BP+4] ; GET COUNT ARGUMENT
MOV DI,0
MOV ES, [BP+6] ; ES:DI -> TEST BUFFER
IN AL, PPI_PORT ; GET CURRENT CONTROL
MOV BL,AL ; SAVE IN BL
OR AX, 1 ; SET TIMER ENABLE BIT
CLI ; STOP INTERRUPTS
CLD ; SET FORWARD DIRECTION
OUT PPI_PORT, AL ; ENABLE TIMER
REP STOSB ; RUN TEST
MOV AL, BL ; RESTORE CONTROL VALUE
OUT PPI_PORT, AL ;
STI ; START INTERRUPTS
CALL GET_TIMER ; OBTAIN FINAL COUNT
POP DI ; RESTORE DI
POP ES ; RESTORE ES
POP BP ; RESTORE BP
RET ; RETURN
_BSTOTIME ENDP
;***************************************************************;
; ;
; _WSTOTIME ;
; TIME EXECUTION OF REP STOSW INSTRUCTION ;
; ;
;***************************************************************;
PUBLIC _WSTOTIME
_WSTOTIME PROC NEAR
PUSH BP ; SAVE FRAME
MOV BP, SP ;
PUSH ES ; SAVE ES
PUSH DI ; SAVE DI
CALL SETUP_TIMER ; SET UP TIMER
MOV CX, [BP+4] ; GET COUNT ARGUMENT
MOV DI,0
MOV ES, [BP+6] ; ES:DI -> TEST BUFFER
IN AL, PPI_PORT ; GET CURRENT CONTROL
MOV BL,AL ; SAVE IN BL
OR AX, 1 ; SET TIMER ENABLE BIT
CLI ; STOP INTERRUPTS
CLD ; SET FORWARD DIRECTION
OUT PPI_PORT, AL ; ENABLE TIMER
REP STOSW ; RUN TEST
MOV AL, BL ; RESTORE CONTROL VALUE
OUT PPI_PORT, AL ;
STI ; START INTERRUPTS
CALL GET_TIMER ; OBTAIN FINAL COUNT
POP DI ; RESTORE DI
POP ES ; RESTORE ES
POP BP ; RESTORE BP
RET ; RETURN
_WSTOTIME ENDP
;***************************************************************;
; ;
; _BMVSTIME ;
; TIME EXECUTION OF REP MOVSB INSTRUCTION ;
; ;
;***************************************************************;
PUBLIC _BMVSTIME
_BMVSTIME PROC NEAR
PUSH BP ; SAVE FRAME
MOV BP, SP ;
PUSH DS ; PUSH DS
PUSH ES ; SAVE ES
PUSH SI ; SAVE SI
PUSH DI ; SAVE DI
CALL SETUP_TIMER ; SET UP TIMER
MOV CX, [BP+4] ; GET COUNT ARGUMENT
MOV DI, 0
MOV SI, DI
MOV DS, [BP+6] ; DS:SI -> SOURCE BUFFER
MOV ES, [BP+8] ; ES:DI -> DEST. BUFFER
IN AL, PPI_PORT ; GET CURRENT CONTROL
MOV BL,AL ; SAVE IN BL
OR AX, 1 ; SET TIMER ENABLE BIT
CLI ; STOP INTERRUPTS
CLD ; SET FORWARD DIRECTION
OUT PPI_PORT, AL ; ENABLE TIMER
REP MOVSB ; RUN TEST
MOV AL, BL ; RESTORE CONTROL VALUE
OUT PPI_PORT, AL ;
STI ; START INTERRUPTS
CALL GET_TIMER ; OBTAIN FINAL COUNT
POP DI ; RESTORE DI
POP SI ; RESTORE SI
POP ES ; RESTORE ES
POP DS ; RESTORE DS
POP BP ; RESTORE BP
RET ; RETURN
_BMVSTIME ENDP
;***************************************************************;
; ;
; _WMVSTIME ;
; TIME EXECUTION OF REP MOVSW INSTRUCTION ;
; FROM SYSTEM MEMORY TO SYSTEM MEMORY ;
; ;
;***************************************************************;
PUBLIC _WMVSTIME
_WMVSTIME PROC NEAR
PUSH BP ; SAVE FRAME
MOV BP, SP ;
PUSH DS ; PUSH DS
PUSH ES ; SAVE ES
PUSH SI ; SAVE SI
PUSH DI ; SAVE DI
CALL SETUP_TIMER ; SET UP TIMER
MOV CX, [BP+4] ; GET COUNT ARGUMENT
MOV DI, 0
MOV SI, DI
MOV DS, [BP+6] ; DS:SI -> SOURCE BUFFER
MOV ES, [BP+8] ; ES:DI -> DEST. BUFFER
IN AL, PPI_PORT ; GET CURRENT CONTROL
MOV BL,AL ; SAVE IN BL
OR AX, 1 ; SET TIMER ENABLE BIT
CLI ; STOP INTERRUPTS
CLD ; SET FORWARD DIRECTION
OUT PPI_PORT, AL ; ENABLE TIMER
REP MOVSW ; RUN TEST
MOV AL, BL ; RESTORE CONTROL VALUE
OUT PPI_PORT, AL ;
STI ; START INTERRUPTS
CALL GET_TIMER ; OBTAIN FINAL COUNT
POP DI ; RESTORE DI
POP SI ; RESTORE SI
POP ES ; RESTORE ES
POP DS ; RESTORE DS
POP BP ; RESTORE BP
RET ; RETURN
_WMVSTIME ENDP
;***************************************************************;
; ;
; _BMVTIME ;
; TIME EXECUTION OF MOV/LOOP BYTE ;
; ;
;***************************************************************;
PUBLIC _BMVTIME
_BMVTIME PROC NEAR
PUSH BP ; SAVE FRAME
MOV BP, SP ;
PUSH DS ; PUSH DS
PUSH ES ; SAVE ES
PUSH SI ; SAVE SI
PUSH DI ; SAVE DI
CALL SETUP_TIMER ; SET UP TIMER
MOV CX, [BP+4] ; GET COUNT ARGUMENT
MOV DI, 0
MOV SI, DI
MOV DS, [BP+6] ; DS:SI -> SOURCE BUFFER
MOV ES, [BP+8] ; ES:DI -> DEST. BUFFER
IN AL, PPI_PORT ; GET CURRENT CONTROL
MOV BL,AL ; SAVE IN BL
OR AX, 1 ; SET TIMER ENABLE BIT
CLI ; STOP INTERRUPTS
CLD ; SET FORWARD DIRECTION
OUT PPI_PORT, AL ; ENABLE TIMER
BMVLP:
MOV AL,[SI] ; RUN TEST
MOV ES:[DI],AL
INC SI
INC DI
LOOP BMVLP
MOV AL, BL ; RESTORE CONTROL VALUE
OUT PPI_PORT, AL ;
STI ; START INTERRUPTS
CALL GET_TIMER ; OBTAIN FINAL COUNT
POP DI ; RESTORE DI
POP SI ; RESTORE SI
POP ES ; RESTORE ES
POP DS ; RESTORE DS
POP BP ; RESTORE BP
RET ; RETURN
_BMVTIME ENDP
;***************************************************************;
; ;
; _WMVTIME ;
; TIME EXECUTION OF MOV/LOOP WORD ;
; ;
;***************************************************************;
PUBLIC _WMVTIME
_WMVTIME PROC NEAR
PUSH BP ; SAVE FRAME
MOV BP, SP ;
PUSH DS ; PUSH DS
PUSH ES ; SAVE ES
PUSH SI ; SAVE SI
PUSH DI ; SAVE DI
CALL SETUP_TIMER ; SET UP TIMER
MOV CX, [BP+4] ; GET COUNT ARGUMENT
MOV DI, 0
MOV SI, DI
MOV DS, [BP+6] ; DS:SI -> SOURCE BUFFER
MOV ES, [BP+8] ; ES:DI -> DEST. BUFFER
IN AL, PPI_PORT ; GET CURRENT CONTROL
MOV BL,AL ; SAVE IN BL
OR AX, 1 ; SET TIMER ENABLE BIT
CLI ; STOP INTERRUPTS
CLD ; SET FORWARD DIRECTION
OUT PPI_PORT, AL ; ENABLE TIMER
WMVLP:
MOV AX,[SI] ; RUN TEST
MOV ES:[DI],AX
INC SI
INC SI
INC DI
INC DI
LOOP WMVLP
MOV AL, BL ; RESTORE CONTROL VALUE
OUT PPI_PORT, AL ;
STI ; START INTERRUPTS
CALL GET_TIMER ; OBTAIN FINAL COUNT
POP DI ; RESTORE DI
POP SI ; RESTORE SI
POP ES ; RESTORE ES
POP DS ; RESTORE DS
POP BP ; RESTORE BP
RET ; RETURN
_WMVTIME ENDP
;***************************************************************;
; ;
; SETUP_TIMER ;
; SET UP THE TIMER FOR MAXIMUM COUNT, TO TIME A RUN ;
; ;
;***************************************************************;
SETUP_TIMER PROC NEAR
PUSH AX ; SAVE AX
IN AL, PPI_PORT ; STOP THE TIMER
AND AL, 0FCH ;
OUT PPI_PORT, AL ;
MOV AL, 0B4H ; INITIALIZE THE TIMER
OUT TIMER_CTRL, AL ;
MOV AL, 0 ; CLEAR THE COUNT
OUT TIMER2_PORT, AL ;
NOP ;
OUT TIMER2_PORT, AL ;
POP AX ; RESTORE AX
RET ; RETURN
SETUP_TIMER ENDP
;***************************************************************;
; ;
; GET_TIMER ;
; TAKE THE COUNT FROM THE TIMER ;
; ;
;***************************************************************;
GET_TIMER PROC NEAR
PUSH BX ; SAVE REGISTERS
IN AL, TIMER2_PORT ; GET LOW BYTE OF TIME
MOV AH, AL ;
IN AL, TIMER2_PORT ; GET HIGH BYTE
XCHG AL,AH ; TIME IN AX
NEG AX ; CORRECT FOR COUNT-DOWN
POP BX ; RESTORE REGISTERS
RET ; RETURN
GET_TIMER ENDP
_TEXT ENDS
END